class Heap<T>{
   data: T[] = [];
   private length: number = 0;

   // 私有工具方法,将数组中的两个元素交换位置
   private swap(i: number, j: number){
    //    [this.data[i], this.data[j]] = [this.data[j], this.data[i]] // Ts的写法
       const temp = this.data[i]
       this.data[i] = this.data[j];
       this.data[j] = temp;
   }
   // 方法
   insert(value:T){
     // 1、将插入的元素放在数组的尾部
     this.data.push(value);
     // 2、将数组的长度加一
     this.length++;
   

     this.heapify_up()

   }

   heapify_up(){
     // 新插入的元素的索引一定是在数组的最后一个位置
     let index = this.length - 1;
     // 上滤操作
     while(index > 0){
          //找到对应的父节点的索引
          let parentIndex = Math.floor((index-1)/2)
          // 将当前节点的大小和父节点的大小进行比较,如果小于父节点，直接结束循环
          if(this.data[index] <= this.data[parentIndex]){
               break
          }else{
               // 如果当前节点大于父节点，则交换两者数据
               this.swap(index,parentIndex)
               // 更新index下标
               index = parentIndex
          }
     }
   }
   
   // 删除
   extract():T | undefined{
        return undefined
   }

   peek():T | undefined {
        return undefined
   }

   size(){
    return this.length
   }

   isEmpty(){
    return this.length == 0
   }

   buildHeap(arr:T[]){

   }

}

const arr = [19,100,36,17,3,25,1,2,7]

const heap = new Heap<number>();

for(const item of arr){
     heap.insert(item);
}

console.log(heap.data)
heap.insert(133);
console.log(heap.data)
heap.insert(65);
console.log(heap.data)



export default {}